﻿#include <learn/ais/ais_auxiliary_point.h>

using namespace xi;
using namespace xi::ais;

AIS_AuxiliaryPoint::AIS_AuxiliaryPoint(std::function<Vec3()> getter, std::function<void(Vec3)> setter)
    : AIS_Point(nullptr), m_getter(getter), m_setter(setter)
{
    // 初始化
    m_point = std::make_shared<Vec3>(getter());
}

void AIS_AuxiliaryPoint::visit(AIS_UpdateMsg *msg)
{
    *m_point = m_getter();

    // 调用父类方法更新
    AIS_Object::visit(msg);
}

void AIS_AuxiliaryPoint::visit(AIS_MoveMsg *msg)
{
    // 拦截上层移动消息
    if (m_status != Status::Pressed)
        return;

    Vec3 n = convert<double>(msg->dir);
    Vec3 p = convert<double>(msg->pos);
    *m_point = p + n * dot(n, *m_point - p);

    // 先赋值，然后再重赋值，进行双重更新
    m_setter(*m_point);
    *m_point = m_getter();

    // 调用父类方法更新
    AIS_Object::visit(msg);
}
